//
//  DownloadBaseModel.h
//  TravelGuideHD
//
//  Created by BigPolarBear on 9/1/14.
//  Copyright (c) 2014 mafengo Inc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "BaseItemWithDownload.h"


#define kNotificationUserInfoKeyId             @"id"          // kNotify_BookDidAddToDownloadQueue  NSNotification中userInfo中的key


typedef enum {
    ItemDownloadPolicy3GAndWifi,
    ItemDownloadPolicyWifiOnly,
    ItemDownloadPolicyAlwaysAsk
}ItemDownloadPolicy;

/**
 总的状态
 */
typedef enum {
    ItemStatusNotExist,     // 不存在
    ItemStatusDownloading,  // 下载中
    ItemStatusWaiting,      // 等待
    ItemStatusPaused,       // 暂停
    ItemStatusInstalling,   // 安装中
    ItemStatusFinished,     // 已完成
    ItemStatusMustUpdate,   // 必须更新（来自老用户升级，由于之前以下载的PDF不再支持，故所有已下载的PDF在新的库中的完成状态都是这个）
    ItemStatusError,        // 出错
    ItemStatusCount
} ItemStatus;



@interface DownloadBaseModel : NSObject

/** 单例 */
+(instancetype)defaultModel;

/** 用户的下载策略 */
@property (nonatomic,assign) ItemDownloadPolicy itemDownloadPolicy;

#pragma mark 子类重写：必须

/**
 Item类型（必须继承自BaseItemWithDownload）
 */
-(Class)classOfItem;

/** 数据库表名 */
-(NSString*)downloadTableName;

/** 业务缓存里的item（所有的Item必须继承自BaseItemWithDownload） */
-(BaseItemWithDownload*)cacheCenterItemById:(NSString*)itemId;

/** 安装已下载的包 */
-(void)startInstallItemWithId:(NSString*)itemId
                   completion:(void(^)(BOOL success, NSError *error))completion;

/** 根据id数组，获取最新数据 */
-(void)requestListByIds:(NSArray*)ids
             completion:(void(^)(NSArray* listItem))completion;


//#pragma mark 子类可选择重写：数据库（暂时不开放子类重写）
//
///** 数据库存储时需额外存储的键值对 */
//-(NSDictionary*)dbExtraDict:(BaseItemWithDownload*)item;


#pragma mark 子类可选择重写：文件路径
/** 
 item所属文件夹： 主路径/子路径（与itemId相关）/ 
 */
-(NSString*)downloadPath:(NSString*)itemId;

/** 
 下载的item文件全路径：主路径/子路径（与itemId相关）/下载文件名
 */
-(NSString*)downloadPathFile:(NSString*)itemId;

/** 主路径 */
-(NSString*)downloadPathMain;

/** 子路径（与itemId相关） */
-(NSString*)downloadPathSub:(NSString*)itemId;

/** 下载文件名 */
-(NSString*)downloadFileName:(NSString*)itemId;




#pragma mark 下载状态

/** Step 1 : 下载状态 */
-(ItemStatus)itemStatus:(NSString*)bookId;

/** Step 2 : 下载进度 */
-(float)itemDownloadPercent:(NSString*)bookId;

/** 攻略是否需要升级 */
-(BOOL)itemDownloadNeedUpdate:(NSString*)bookId;



#pragma mark 下载控制

/** 添加到下载列表中 */
-(BOOL)itemDownloadAdd:(NSString*)bookId;
/** 重新下载（会删除已下载）*/
-(BOOL)itemDownloadUpdate:(NSString*)bookId;

/** 下载开始 */
-(BOOL)itemDownloadStart:(NSString*)bookId;
/** 下载暂停 */
-(BOOL)itemDownloadPause:(NSString *)bookId;
/** 下载移除 */
-(BOOL)itemDownloadRemove:(NSString*)bookId;



#pragma mark 通知相关
/** 通知：下载实例状态变化 */
+(NSString*)notificationOfItemStatusChanged;
/** 通知：下载进度变化 */
+(NSString*)notificationOfDownloadPercentChanged;
/** 通知：下载队列新增 */
+(NSString*)notificationOfDownloadAdded;

#pragma mark - 监控网络
/** 开始监控 */
- (void)startListenNetWorkAndAutoRun;
/** 结束监控 */
- (void)stopListenNetWorkAndAutoRun;

#pragma mark 访问记录
/** 记录访问 */
-(void)visitItemId:(NSString*)itemId;
/** 获取最近访问过的book信息 */
-(NSArray*)getListVisitedIds;



#pragma mark 下载列表

/** 获取下载列表（Item的数据为当时下载的版本，比ListModel里的可能老） */
-(NSArray*)getListDownload;

/** 根据id获取下载时的信息 */
-(id)getItem:(NSString*)itemId;


#pragma mark 一键更新

/** （本地）更新全部需更新（下载最新版本，并返回更新的数量） */
-(NSInteger)itemDownloadUpdateAll;
/** （本地）获取下载列表中需更新的 */
-(NSArray*)itemDownloadCheckUpdateLocal;
/** （在线）获取下载列表中需更新的 */
-(void)itemDownloadCheckUpdateOnlineCompletion:(void(^)(NSArray* listItemNeedUpdate))completion;


#pragma mark 下载统计

/** 当前下载总数（含未完成）*/
-(NSInteger)itemDownloadCountTotal;

// 检查更新 检查所有的已下载书籍
-(void)refreshAllDownloadListItem;


@end
